package com.example.infomanagesystem.interceptor;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.util.SaResult;
import com.example.infomanagesystem.exception.BusinessException;
import com.example.infomanagesystem.result.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @forerunner
 * @Date 2023-08-07 10:01
 */
//全局异常拦截类  必须加 @RestControllerAdvice注解
@RestControllerAdvice
public class GlobalExceptionHandler {
    // 创建日志记录器
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    // 拦截：未登录异常 token过期

    //拦截所有异常
    @ExceptionHandler(Exception.class)
    public R handlerException(Exception e) {
        // 记录详细的错误日志
        logger.error("系统异常: {}", e.getMessage(), e);
        return new R(404,e.getMessage(),"");
    }

    //拦截BusinessException异常
    @ExceptionHandler(BusinessException.class)
    public R handlerBusinessException(BusinessException e) {
        // 记录业务异常的详细信息
        logger.error("业务异常 - 错误码: {}, 错误信息: {}, 详细描述: {}",
                e.getCode(), e.getMessage(), e.getDescription(), e);
        return new R( e.getCode(),e.getMessage(),e.getDescription());
    }

    @ExceptionHandler(NotLoginException.class) //指定捕获 未登录异常
    public R handlerException(NotLoginException e) {
        // 记录未登录异常的详细信息
        logger.error("用户未登录异常: {}", e.getMessage(), e);
        // 返回给前端
        return new R(404,e.getMessage(),"登录过期 请重新登录");
    }


    // 拦截：缺少角色异常
    @ExceptionHandler(NotRoleException.class)
    public R handlerException(NotRoleException e) {
        // 记录权限不足异常的详细信息
        logger.error("用户权限不足异常: {}", e.getMessage(), e);
        return new R(403,e.getMessage(),"暂无权限");
    }


}